﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.IO;
using PluginInterface;

namespace Host
{
    public partial class Form1 : Form
    {

        private bool esCero1 = true;
        private bool esCero2 = true;
        private bool enabledCaja1 = true;
        private bool enabledCaja2 = false;
        private bool signo1 = false;
        private bool signo2 = false;
 
        public Form1()
        {
            InitializeComponent();
           
        }

        private void Siete_Click(object sender, EventArgs e)
        {
            if (enabledCaja1)
            {
                if (esCero1)
                    Caja1.Text = "7";
                else
                    Caja1.Text = Caja1.Text + "7";
                esCero1 = false;
            }
            else
                if (enabledCaja2)
                {
                    if (esCero2)
                        Caja2.Text = "7";
                    else
                        Caja2.Text = Caja2.Text + "7";
                    esCero2 = false;             
                }
        }

        private void Ocho_Click(object sender, EventArgs e)
        {
            if (enabledCaja1)
            {
                if (esCero1)
                    Caja1.Text = "8";
                else
                    Caja1.Text = Caja1.Text + "8";
                esCero1 = false;
            }
            else
                if (enabledCaja2)
                {
                    if (esCero2)
                        Caja2.Text = "8";
                    else
                        Caja2.Text = Caja2.Text + "8";
                    esCero2 = false;
                }
        }

        private void Nueve_Click(object sender, EventArgs e)
        {
            if (enabledCaja1)
            {
                if (esCero1)
                    Caja1.Text = "9";
                else
                    Caja1.Text = Caja1.Text + "9";
                esCero1 = false;
            }
            else
                if (enabledCaja2)
                {
                    if (esCero2)
                        Caja2.Text = "9";
                    else
                        Caja2.Text = Caja2.Text + "9";
                    esCero2 = false;
                }
        }

        private void Cuatro_Click(object sender, EventArgs e)
        {
            if (enabledCaja1)
            {
                if (esCero1)
                    Caja1.Text = "4";
                else
                    Caja1.Text = Caja1.Text + "4";
                esCero1 = false;
            }
            else
                if (enabledCaja2)
                {
                    if (esCero2)
                        Caja2.Text = "4";
                    else
                        Caja2.Text = Caja2.Text + "4";
                    esCero2 = false;
                }
        }

        private void Cinco_Click(object sender, EventArgs e)
        {
            if (enabledCaja1)
            {
                if (esCero1)
                    Caja1.Text = "5";
                else
                    Caja1.Text = Caja1.Text + "5";
                esCero1 = false;
            }
            else
                if (enabledCaja2)
                {
                    if (esCero2)
                        Caja2.Text = "5";
                    else
                        Caja2.Text = Caja2.Text + "5";
                    esCero2 = false;
                }
        }

        private void Seis_Click(object sender, EventArgs e)
        {
            if (enabledCaja1)
            {
                if (esCero1)
                    Caja1.Text = "6";
                else
                    Caja1.Text = Caja1.Text + "6";
                esCero1 = false;
            }
            else
                if (enabledCaja2)
                {
                    if (esCero2)
                        Caja2.Text = "6";
                    else
                        Caja2.Text = Caja2.Text + "6";
                    esCero2 = false;
                }
        }

        private void Uno_Click(object sender, EventArgs e)
        {
            if (enabledCaja1)
            {
                if (esCero1)
                    Caja1.Text = "1";
                else
                    Caja1.Text = Caja1.Text + "1";
                esCero1 = false;
            }
            else
                if (enabledCaja2)
                {
                    if (esCero2)
                        Caja2.Text = "1";
                    else
                        Caja2.Text = Caja2.Text + "1";
                    esCero2 = false;
                }
         
        }

        private void Dos_Click(object sender, EventArgs e)
        {
            if (enabledCaja1)
            {
                if (esCero1)
                    Caja1.Text = "2";
                else
                    Caja1.Text = Caja1.Text + "2";
                esCero1 = false;
            }
            else
                if (enabledCaja2)
                {
                    if (esCero2)
                        Caja2.Text = "2";
                    else
                        Caja2.Text = Caja2.Text + "2";
                    esCero2 = false;
                }
              
        }

        private void Tres_Click(object sender, EventArgs e)
        {
            if (enabledCaja1)
            {
                if (esCero1)
                    Caja1.Text = "3";
                else
                    Caja1.Text = Caja1.Text + "3";
                esCero1 = false;
            }
            else
                if (enabledCaja2)
                {
                    if (esCero2)
                        Caja2.Text = "3";
                    else
                        Caja2.Text = Caja2.Text + "3";
                    esCero2 = false;
                }
            
        }

        private void Cero_Click(object sender, EventArgs e)
        {
            if (enabledCaja1)
            {
                if (esCero1)
                    Caja1.Text = "0";
                else
                    Caja1.Text = Caja1.Text + "0";
                esCero1 = false;
            }
            else
                if (enabledCaja2)
                {
                    if (esCero2)
                        Caja2.Text = "0";
                    else
                        Caja2.Text = Caja2.Text + "0";
                    esCero2 = false;
                }

        }

        private void Delete_Click(object sender, EventArgs e)
        {
            if (enabledCaja1)
            {
                if ((Caja1.Text.Length > 0) && (!esCero1))
                {
                    Caja1.Text = Caja1.Text.Substring(0, Caja1.Text.Length - 1);
                }
                if (Caja1.Text.Length == 0)
                {
                    Caja1.Text = "0";
                    esCero1 = true;
                    signo1 = false;
                }

            }
            else
                if (enabledCaja2)
                {
                    if ((Caja2.Text.Length > 0) && (!esCero2))
                    {
                        Caja2.Text = Caja2.Text.Substring(0, Caja2.Text.Length - 1);
                    }
                    if (Caja2.Text.Length == 0)
                    {
                        Caja2.Text = "0";
                        esCero2 = true;
                        signo2 = false;
                    }
                }
  
        }

        void CargarComplementos()
        {      
            // Aquí se cargan los complementos
            string directorioPlugins = Application.StartupPath + @"\Plugins";                  

            // Si no existe el directorio de plugins, debe crearse
            if (!Directory.Exists(directorioPlugins))
            {
                Directory.CreateDirectory(directorioPlugins);
            }
            // Leer los archivos ensamblados
            string[] archivos = Directory.GetFiles(directorioPlugins, "*.dll");


            bool esta = false;
            int i = 0;
            if (archivos.Length == 0)
            {

                DirectoryInfo D = Directory.GetParent(Application.StartupPath);
                DirectoryInfo[] subD = D.GetDirectories();

                while ((!esta) && (i < subD.Length))
                {
                    if (subD[i].Name.Equals("Plugins"))
                    {
                        esta = true;
                        archivos = Directory.GetFiles(subD[i].FullName, "*.dll");
                    }
                    i++;
                }

            }

            // Examinar los ensamblados uno a uno
            foreach (string archivo in archivos)
            {
                // Aquí se examinan los ensamblados
                Assembly ensamblado = Assembly.LoadFile(archivo);
                // Cargar los tipos que contiene el ensamblado

                Type[] tipos = ensamblado.GetTypes();
                // Examinar cada uno de los tipos
                foreach (Type tipo in tipos)
                {
                    // Si el tipo es una clase, instanciar un objeto
                    if (tipo.IsClass)
                    {
                        // Crear una instancia de la clase
                        Object plugin = Activator.CreateInstance(tipo);

                        // Acceder el método Calcular
                        MethodInfo metodoCalcular = tipo.GetMethod("Calcular");
                     
                       if (metodoCalcular != null)
                       {
                            metodoCalcular.Invoke(plugin, new String[] { this.Caja1.Text, this.Caja2.Text });
                       }


                       // Acceder el método Initialize
                       MethodInfo metodoInicializar = tipo.GetMethod("Initialize");

                       // Si el método existe, ejecutarlo en el objeto
                       if (metodoInicializar != null)
                       {
                            metodoInicializar.Invoke(plugin, new object[] { this.operacion });
                       }
                   
                    }
                }
            }
        }

        private void Actualizar_Click(object sender, EventArgs e)
        {

            this.operacion.DropDownItems.Clear();    
            CargarComplementos();
        }

  
        private void Form1_Load(object sender, EventArgs e)
        {
            CargarComplementos();
            Caja1.Focus();
        }

     

        private void operacion_Click(object sender, EventArgs e)
        {
            Actualizar_Click(null, null);
        }


        private void Caja1_Click(object sender, EventArgs e)
        {
            enabledCaja1 = true;
            enabledCaja2 = false;
        }

        private void Caja2_Click(object sender, EventArgs e)
        {
            enabledCaja1 = false;
            enabledCaja2 = true;
        
        }

        private void Caja1_KeyPress(object sender, KeyPressEventArgs e)
        {
      
            if (esCero1)
            {
                Caja1.Text = "";
                esCero1 = false;
            }
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (e.KeyChar.Equals('-'))
            {
                if (signo1)
                {
                    MessageBox.Show("Ya ha colocado un signo menos", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information);         
                }
                else
                {
                    Caja1.Text = "-" + Caja1.Text;
                    signo1 = true;
                }
                e.Handled = true;
            }
            else
            {
                e.Handled = true;
                MessageBox.Show("Debe ingresar números", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }   
        }

        private void Caja2_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (esCero2)
            {
                Caja2.Text = "";
                esCero2 = false;
            }
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (e.KeyChar.Equals('-'))
            {
                if (signo2)
                {
                    MessageBox.Show("No puede colocar aquí un signo menos", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    Caja2.Text = "-" + Caja2.Text;
                    signo2 = true;
                }
                e.Handled = true;
            }
            else
            {  
                e.Handled = true;
                MessageBox.Show("No puede colocar aquí un signo menos", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }     
        }


      }
   
}
       
  
